package com.example.store.controller;

import com.example.store.controller.ex.*;
import com.example.store.entity.User;
import com.example.store.service.IUserService;
import com.example.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("users")
public class UserController extends BaseController {
    @Autowired
    private IUserService userService;

//    @ResponseBody
    /**注册用户，往数据库中添加用户数据*/
    @RequestMapping("reg")
    public JsonResult<Void> reg(User user){
        userService.reg(user);
        return new JsonResult<Void>(OK);
    }

    /**用户登录*/
    @RequestMapping("login")
    public JsonResult<User> login(String username, String password, HttpSession session){
        User data = userService.login(username, password);
        session.setAttribute("uid",data.getUid());
        session.setAttribute("username",data.getUsername());
        session.setAttribute("avatar",data.getAvatar());
        return new JsonResult<User>(OK,data);
    }

    @RequestMapping("change_password")
    public JsonResult<Void> changePassword(String oldPassword,String newPassword,HttpSession session){
        Integer uid = getUidFromSession(session);
        String username = getUsernameFromSession(session);
        userService.changePassword(uid,username,oldPassword,newPassword);
        return new JsonResult<Void>(OK);
    }

    @RequestMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session){
        User data = userService.getdataByUid(getUidFromSession(session));
        return new JsonResult<User>(OK,data);
    }

    @RequestMapping("change_info")
    public JsonResult<Void> changeInfo(User user,HttpSession session){
        userService.changeInfo(getUidFromSession(session),
                getUsernameFromSession(session),
                user);
        return new JsonResult<>(OK);
    }

    //文件上传大小限制
    public static final int AVATAR_MAX_SIZE=10*1024*1024;
    //文件类型限制
    public static final List<String> AVATAR_TYPE=new ArrayList<>();
    static {
        AVATAR_TYPE.add("image/jpeg");
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/gif");
        AVATAR_TYPE.add("image/jpeg");
    }

    /**
     * MultipartFile接口是springmvc提供的一个接口，
     * 这个接口为我们包装了获取文件类型的数据（任何类型的文件file都可以）
     * SpringMVC，只需要在处理请求的方法参数列表上声明一个参数类型为MultipartFile的参数，
     * 会自动将文件当中的数据复制给这个参数
     * @RequestPara 表示请求中的参数，将请求的参数请求注入方法的某个参数上，
     * 如果名称不一致则可以使用@RequestPara注解进行标记和映射
     * @param session
     * @param file
     * @return
     */
    @RequestMapping("change_avatar")
    public JsonResult<String> changeAvatar(
            HttpSession session,
            @RequestParam("file") MultipartFile file
    ){
        System.out.println(file.getContentType());
        if(file.isEmpty()){
            throw new FileEmptyException("上传文件为空");
        }
        if(file.getSize()>AVATAR_MAX_SIZE){
            throw new FilesSizeException("上传文件超出大小限制");
        }
        if(!AVATAR_TYPE.contains(file.getContentType())){
            throw new FiletypeException("文件类型错误");
        }
        //获取文件上传路径
        String parent = session.getServletContext().getRealPath("upload");
        File dir = new File(parent);
        if(!dir.exists()){ //检测当前目录是否存在
            dir.mkdirs(); //不存在则创建文件
        }
        //获取文件名称，利用UUID工具来将生成一个新的字符串作为文件名
        //例如 AVATAR01.png
        String originalFilename = file.getOriginalFilename();
        //获取后缀
        int index = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(index);
        //利用UUID生成随机字符串（不可重复）
        String filename = UUID.randomUUID().toString().toUpperCase()+suffix;
        //创建空文件并且写入文件数据
        File dest = new File(dir,filename);
        //利用MultipartFile自带的API功能复制数据
        try {
            file.transferTo(dest);
        } catch (FileStateException e) {
            throw new FileStateException("文件状态异常");
        } catch (IOException e) {
            throw new FileUploadIOException("文件读写异常");
        }
        String avatar="/upload/"+filename;
        userService.changeAvatarByUid(getUidFromSession(session),
                avatar,
                getUsernameFromSession(session)
                );
        return new JsonResult<String>(OK,avatar);

    }


    /*@RequestMapping("login/{username}/{password}")
    public JsonResult<User> login(@PathVariable("username") String username,@PathVariable("password") String password){
        User data = userService.login(username, password);
        return new JsonResult<User>(OK,data);
    }*/
}
